import { TreeMap } from './models/common-model';
import { defaultModuleIndex, ModuleTemplateIndex, ModuleTemplateOption } from './models/model-options';
import { Module, ModuleConfigInitFun } from './models/module-models';
import { DirTemplateCreator } from './models/template-models';

/**
 * 创建一个模块对象的方法
 */
export type ModuleCreator = (moduleName: string, option: ModuleTemplateOption) => Module

/**
 * 存储或查询 创建常见module对象的函数 的构建类
 */
class ModuleBuilder {
  private readonly moduleCreatorMap: TreeMap<ModuleCreator, ModuleTemplateIndex> =
    new TreeMap<ModuleCreator, ModuleTemplateIndex>(defaultModuleIndex);

  /**
   * 查找模块生成方法
   *
   * @param {ModuleTemplateIndex} index
   * @return {ModuleCreator | undefined}
   */
  public findModuleCreator(index: ModuleTemplateIndex): ModuleCreator | undefined {
    return this.moduleCreatorMap.find(index);
  }

  /**
   * 添加模块
   *
   * @param {DirTemplateCreator} template
   * @param {ModuleTemplateIndex} index
   * @param {ModuleConfigInitFun} initFun
   */
  public add(index: ModuleTemplateIndex, template: DirTemplateCreator, initFun: ModuleConfigInitFun) {
    this.moduleCreatorMap.insert({ ...index }, (moduleName, option) => {
      return new Module(template(moduleName), option, initFun);
    });
  }
}

/**
 * 用于储存 其他子模块模板的库
 *
 * @type {ModuleBuilder}
 */
export const moduleBuilder: ModuleBuilder = new ModuleBuilder();

/**
 * 用于储存 entry模块模板的库
 *
 * @type {ModuleBuilder}
 */
export const entryBuilder: ModuleBuilder = new ModuleBuilder();

